package com.lagou.testDBUtils;

import com.lagou.Utils.DruidUtils;
import com.lagou.entity.Employee;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class DBUtilsDemo03 {

    /*
    *
    * 查询eid为5的记录 封装到数组中
    * ArrayHandler 将结果集的第一条数据封装到数组中
    * */

    @Test
    public void testFindById() throws Exception{

        //1.创建QueryRunner 自动模式
        QueryRunner qr=new QueryRunner(DruidUtils.getDataSource());

        //2.编写SQL
        String sql="select * from employee where eid=?";

        //3.设置占位符参数 并执行查询
        Object[] query = qr.query(sql, new ArrayHandler(), 5);

        //4.获取数据
        System.out.println("查询到的id为5的记录为:"+ Arrays.toString(query));

    }
    /*
    * 查询所有数据 封装到list集合中
    * ArrayListHandler 可以将每条数据先封装到数组中 再将数组封装到集合中
    * */
    @Test
    public void testFindAll() throws SQLException {

        //1.创建QueryRunner 自动模式
        QueryRunner qr=new QueryRunner(DruidUtils.getDataSource());

        //2.编写SQL
        String sql="select * from employee";

        //3.执行查询
        List<Object[]> query = qr.query(sql, new ArrayListHandler());

        //4.遍历集合 获取数据
        for(Object[] ob:query){
            System.out.println("查询到的所有数据为:"+Arrays.toString(ob));
        }
    }

    /*
    * 查询eid为3的数据 封装到指定的JavaBean中
    * BeanHandler 将结果集的第一条数据封装到JavaBean中
    * */
    @Test
    public void testFindByIdJavaBean() throws SQLException{

        //1.创建QueryRunner 自动模式
        QueryRunner qr=new QueryRunner(DruidUtils.getDataSource());

        //2.编写SQL
        String sql="select * from employee where eid=?";

        //3.执行查询
        Employee employee = qr.query(sql, new BeanHandler<Employee>(Employee.class), 3);

        //4.获取数据
        System.out.println("查询到eid为3的数据为:"+employee);

    }


    /*
    * 查询薪资大于3000 的所有员工信息 封装到JavaBean中再封装到List集合中
    * BeanListHandler 将结果集的每一条数据封装到JavaBean中 再将JavaBean放到List集合中
    * */
    @Test
    public void testFindBySalary() throws SQLException{
        QueryRunner qr=new QueryRunner(DruidUtils.getDataSource());

        String sql="select * from employee where salary>?";

        List<Employee> list = qr.query(sql, new BeanListHandler<Employee>(Employee.class), 3000);

        for(Employee ep:list) {
            System.out.println("查询到的薪资大于3000的所有员工信息为:" + ep);

        }
    }


    /*
    * 查询姓名是 张百万的员工信息,将结果封装到Map集合中
    * MapHandler 将结果集的第一条记录封装到Map<String,Object>中
    * key对应是列明 value对应的是列的值
    * */
    @Test
    public void testFindByName() throws SQLException{
        QueryRunner qr=new QueryRunner(DruidUtils.getDataSource());

        String sql="select * from employee where ename=?";

        Map<String, Object> map = qr.query(sql, new MapHandler(), "张百万");

        Set<Map.Entry<String, Object>> entries = map.entrySet();

        for(Map.Entry<String,Object> et:entries){
            //打印结果
            System.out.println(et.getKey()+"="+et.getValue());
        }
    }



    /*
    * 查询所有员工的薪资总额
    * ScalarHandler 用于封装单个的数据
    * */
    @Test
    public void testGetSum() throws SQLException {
        QueryRunner qr=new QueryRunner(DruidUtils.getDataSource());

        String sql="select sum(salary) from employee";

        Double sum=(Double)qr.query(sql,new ScalarHandler<>());

        System.out.println("员工薪资总额为:"+sum);
    }



}
